package utils

import (
	"go_pure_admin_api/global"
	"strings"
)

// CheckPermission 通过jwt验证是否有权限。
func CheckPermission(m *Claims, url string, method string) bool {
	// 超级管理员
	if IsSuperAdmin(m.RoleKeys) {
		return true
	}
	// 获取用户拥有的权限
	return IsPermission(m.Username, url, method)
}

// IsSuperAdmin 判断是否是有超级管理员权限
func IsSuperAdmin(roleKeys []string) bool {
	for _, roleKey := range roleKeys {
		if roleKey == "root" {
			return true
		}
	}
	return false
}

// IsPermission 判断用户是否有权限
func IsPermission(username string, url string, method string) bool {
	// 如果url包含public，则直接放行
	if strings.Contains(url, "public") {
		return true
	}
	enforce, err := global.Casbin.Enforce(username, url, method)
	if err != nil {
		return false
	}
	return enforce
}

// AddPermissionForRole 根据角色key添加API权限
// policies [][]string 格式为 [["root","/api/v1/user", "GET"], ["root","/api/v1/role", "POST"]]
func AddPermissionForRole(policies [][]string) (bool, error) {
	added, err := global.Casbin.AddPolicies(policies)
	if err != nil {
		return false, err
	}
	return added, nil
}

// GetPermissionForRole 根据角色key查看是否有策略
func GetPermissionForRole(roleKey string) bool {
	policies, _ := global.Casbin.GetFilteredPolicy(0, roleKey)
	return len(policies) > 0
}

// GetPermissionForResource 根据资源查看是否有策略
func GetPermissionForResource(resource string) bool {
	policies, _ := global.Casbin.GetFilteredPolicy(1, resource)
	if len(policies) > 0 {
		return true
	} else {
		return false
	}
}

// RemovePermissionForRole 删除角色权限
func RemovePermissionForRole(roleKey string) (bool, error) {
	// 删除角色所有权限 这里得0表示赛选sub=roleKey的策略；对应数据库里面v0的策略
	is, err := global.Casbin.RemoveFilteredPolicy(0, roleKey)
	if err != nil {
		return false, err
	}
	return is, nil
}

// RemovePermissionForResource 根据资源删除所有权限
func RemovePermissionForResource(resource string) (bool, error) {
	// 删除角色所有权限 这里得1对应数据库里面v1的策略
	is, err := global.Casbin.RemoveFilteredPolicy(1, resource)
	if err != nil {
		return false, err
	}
	return is, nil
}

// AddUserRole 添加用户和角色key的关联规则
func AddUserRole(username string, roleKey string) (bool, error) {
	is, err := global.Casbin.AddGroupingPolicy(username, roleKey)
	if err != nil {
		return false, err
	}
	return is, nil
}

// GetUserRoleByLoginName 查看用户是否有关联的角色
func GetUserRoleByLoginName(username string) bool {
	policies, err := global.Casbin.GetFilteredNamedGroupingPolicy("g", 0, username)
	if err != nil {
		return false
	}
	return len(policies) > 0
}

// RemoveUserRole 清空用户角色关联规则
func RemoveUserRole(username string) (bool, error) {
	is, err := global.Casbin.RemoveFilteredGroupingPolicy(0, username)
	if err != nil {
		return false, err
	}
	return is, nil
}
